#include "volumetool.h"
#include "ui_volumetool.h"

#include<QGraphicsDropShadowEffect>
#include<QPainter>
#include<QDebug>

VolumeTool::VolumeTool(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::VolumeTool),
    isMuted(false), //初始为 不静音
    volumeRatio(20)//初始音量为 20
{
    ui->setupUi(this);

    //在volumeTool 构造函数中 设置这个volumeTool 是一个弹出widget
    //setWindowFlag(Qt::Popup) setWindowFlags 作用：设置窗口的标志，多个标志用 |
    //          标记为弹出式窗口 | 移除窗口的默认边框和标题栏 | 禁用系统默认的窗口阴影
    setWindowFlags(Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint); //多个设置 + s
    setAttribute(Qt::WA_TranslucentBackground); //设置窗口属性为背景透明

    //窗口增加自定义阴影
    QGraphicsDropShadowEffect* shadowEffect = new QGraphicsDropShadowEffect(this); //阴影对象
    shadowEffect->setColor("#646464");//设置颜色
    shadowEffect->setBlurRadius(10);//设置阴影半径
    shadowEffect->setOffset(0,0);//设置阴影偏移量
    setGraphicsEffect(shadowEffect);//设置


    //设置按钮图标
    ui->silenceBtn->setIcon(QIcon(":/images/volumn.png"));

    //设置默认音量为20%
    ui->volumeRatio->setText("20%");

    //设置outLine尺寸
    QRect rect = ui->outLine->geometry();
    //outline 原本高度180*20% ，25是 rect 距离父元素volumeBox的距离
    ui->outLine->setGeometry(rect.x(),180-36+25,rect.width(),36);//36就是rect.height()

    //移动按钮的位置
    ui->sliderBtn->move(ui->sliderBtn->x(),ui->outLine->y() - ui->sliderBtn->height() / 2);
    //QRect rect1 = ui->sliderBtn->geometry();
    //ui->sliderBtn->setGeometry(rect1.x(),180-36+25,rect1.width(),rect1.height());


    //点击静音按钮 若手动connect
    //connect(ui->silenceBtn, &QPushButton::clicked, this, &VolumeTool::onSilenceBtnClicked);

    //安装事件拦截器 - 否则即使事件发生也不会触发
    ui->volumeBox->installEventFilter(this);

}

VolumeTool::~VolumeTool()
{
    delete ui;
}

void VolumeTool::paintEvent(QPaintEvent *event)
{
    (void)event;
    //绘制volumetool中的三角形

    //1.设置画家
    QPainter painter(this); //在QPaintDevice上画
    //2.设置画笔
    painter.setPen(Qt::NoPen); //参数可以传一个画笔对象或者直接传画笔的格式
    //3.设置画刷
    painter.setBrush(QBrush(Qt::white));  //参数可以传一个画刷对象或者直接传画刷的格式
    //4.绘制三角形
    QPolygon polygon; //创建三角形对象
    QPoint a(10,300);
    QPoint b(10+80,300);
    QPoint c(10+40,300+20);
    polygon.append(a);
    polygon.append(b);
    polygon.append(c);

    painter.drawPolygon(polygon);

}

bool VolumeTool::eventFilter(QObject *watched, QEvent *event)
{
    if(ui->volumeBox == watched)
    {
        // 事件发生在volumeBox控件上
        if(event->type() == QEvent::MouseButtonPress)
        {
            // 鼠标按下事件
            calcVolume();

        }
        else if(event->type() == QEvent::MouseButtonRelease)
        {
            // 鼠标释放事件
            emit setMusicVolume(volumeRatio);

        }
        else if(event->type() == QEvent::MouseMove)
        {
            // 鼠标移动事件
            calcVolume();
            emit setMusicVolume(volumeRatio);

        }

        return true;
    }

    return QObject::eventFilter(watched, event); //没有拦截处理的 交给父类处理
}


//计算音量大小 更新outLine高低 更新sliderBtn的位置 更新音量百分比
void VolumeTool::calcVolume()
{

    // 获取鼠标点击时的y坐标
    int height = ui->volumeBox->mapFromGlobal(QCursor().pos()).y();

    // 验证height的合法性：[25, 205]
    height = height < 25? 25:height;
    height = height > 205? 205 : height;

    // 更新outLine大小
    ui->outLine->setGeometry(ui->outLine->x(), height, ui->outLine->width(), 205-height);

    // 更新sliderBtn的位置
    // sliderBtn实际矩形，设置了圆角效果之后，呈现出来是圆
    // 移动siliderBtn实际就是重新找其矩形左上角的位置，左上角位置就是outLine左上角y-siliderBtn的高度即可
    // silderBtn的圆心刚好和ui->outLine的上边界平齐
    ui->sliderBtn->move(ui->sliderBtn->x(), ui->outLine->y() - ui->sliderBtn->height()/2);

    // 计算音量大小
    volumeRatio = (int)(ui->outLine->height()/(float)180*100);

    // 更新音量百分比
    ui->volumeRatio->setText(QString::number(volumeRatio)+"%");


}

void VolumeTool::on_silenceBtn_clicked() //静音按钮的槽函数 -- 直接转到槽
{
    isMuted = !isMuted;

    //静音图标切换
    if(isMuted == true)//如果是静音
    {
        ui->silenceBtn->setIcon(QIcon(":/images/silent.png"));

    }
    else // 非静音
    {
        ui->silenceBtn->setIcon(QIcon(":/images/volumn.png"));
    }

    //媒体静音设置，发射信号让QQMusic处理
    emit setMusicMuted(isMuted);
}









